Code Smell - Booleano ternários

#public #codesmell

Booleanos que podem ser nulos são code smell.

Não use booleanos para variáveis que podem assumir três valores diferentes (tri-state boolean).

Exemplo de código ruim, onde quem chama a função precisa conhecer a implementação para saber o que acontece em cada caso:

def update_opt_out(user: User, value: bool | None  = None):
    if value is True:
        user.opt_out_at = datetime.utcnow()
    elif value is False:
        user.opt_out_at = None
    elif value is None:
	    ... # do nothing

Invés disso use uma enumeração e dê nomes claros para cada caso, exemplo:

class OptOutAction:
    SET_OPT_OUT = 1
    CLEAR_OPT_OUT = 2
    KEEP_PREVIOUS_OPT_OUT = 3

def update_opt_out(
    user: User,
    value: OptOutAction = OptOutAction.KEEP_PREVIOUS_OPT_OUT
):
    if value == OptOutAction.SET_OPT_OUT:
        user.opt_out_at = datetime.utcnow()
    elif value == OptOutAction.CLEAR_OPT_OUT:
        user.opt_out_at = None
    elif value == KEEP_PREVIOUS_OPT_OUT:
	    ... # do nothing